﻿#include <stdio.h>
#include "C++primary.h"
#include <stdlib.h>
// 1. 正常的命名空间定义
// bit是命名空间的名字，⼀般开发中是⽤项⽬名字做命名空间名。
// 我们上课⽤的是bit，⼤家下去以后⾃⼰练习可以考虑⽤⾃⼰名字缩写，如张三：zs
//namespace song
//{
//	// 命名空间中可以定义变量/函数/类型
//	int rand = 10;
//	int Add(int left, int right)
//	{
//		return left + right;
//	}
//	struct Node
//	{
//		struct Node* next;
//		int val;
//	};
//}
//int main()
//{
//	// 这⾥默认是访问的是全局的rand函数指针
//	printf("%p\n", rand);
//	// 这⾥指定bit命名空间中的rand
//	printf("%d\n", song::rand);
//	return 0;
//}



////2. 命名空间可以嵌套
//namespace song
//{
//	
//	namespace song1
//	{
//		int rand = 1;
//		int Add(int left, int right)
//		{
//			return left + right;
//		}
//
//	}
//	namespace song2
//	{
//		int rand = 2;
//		int Add(int left, int right)
//		{
//			return (left + right) * 10;
//		}
//	}
//}
//
//int main()
//{
//	printf("%d\n", song::song1::rand);
//	printf("%d\n", song::song2::rand);
//	printf("%d\n", song::song1::Add(1, 2));
//	printf("%d\n", song::song2::Add(1, 2));
//	return 0;
//}

/*namespace song
{
	int d = 4;
	int e = 5;
	int f = 6;
}

int main()
{
	printf("%d\n", song::a);
	printf("%d\n", song::b);
	printf("%d\n", song::c);
	printf("%d\n", song::d);
	printf("%d\n", song::e);
	printf("%d\n", song::f);
}*/

//// 指定命名空间访问
//int main()
//{
//	printf("%d\n", N::a);
//	return 0;
//}
//// using将命名空间中某个成员展开
//using N::b;
//int main()
//{
//	printf("%d\n", N::a);
//	printf("%d\n", b);
//	return 0;
//}


// 展开命名空间中全部成员
//using namespce N;
//int main()
//{
//	printf("%d\n", a);
//	printf("%d\n", b);
//	return 0;
//}



//using std::cout;
//using std::cin;
//using std::endl;
//using namespace std
//int main()
//{
//	int a = 10;
//	//自动识别数据类型
//	cout << "修改之前a = " << a << endl;
//	cin >> a;
//	cout << "修改之后a = " << a << endl;

//}


//#include <iostream>
//#include <assert.h>
//using namespace std;
//void Func(int a = 0)
//{
//	cout << a << endl;
//}
//int main()
//{
//	Func(); // 没有传参时，使⽤参数的默认值
//	Func(10); // 传参时，使⽤指定的实参
//	return 0;
//}


using namespace std;
// 全缺省
//void Func1(int a = 10, int b = 20, int c = 30)
//{
//	cout << "a = " << a << endl;
//	cout << "b = " << b << endl;
//	cout << "c = " << c << endl << endl;
//}
//// 半缺省
//void Func2(int a, int b = 10, int c = 20)
//{
//	cout << "a = " << a << endl;
//	cout << "b = " << b << endl;
//	cout << "c = " << c << endl << endl;
//}
//int main()
//{
//	Func1();
//	Func1(1);
//	Func1(1, 2);
//	Func1(1, 2, 3);
//	Func2(100);
//	Func2(100, 200);
//}

// 缺省参数不能声明和定义同时给
//void test(int n = 4)错误
//{
//	cout << n << endl;
//}
//
//void test(int n)//正确
//{
//	cout << n << endl;
//}
//int main()
//{
//	test();
//}

//函数重载
// 1、参数类型不同
//int Add(int left, int right)
//{
//	cout << "int Add(int left, int right)" << endl;
//	return left + right;
//}
//double Add(double left, double right)
//{
//	cout << "double Add(double left, double right)" << endl;
//	return left + right;
//}
//// 2、参数个数不同
//void f()
//{
//	cout << "f()" << endl;
//}
//void f(int a)
//{
//	cout << "f(int a)" << endl;
//}
//// 3、参数类型顺序不同
//void f(int a, char b)
//{
//	cout << "f(int a,char b)" << endl;
//}
//void f(char b, int a)
//{
//	cout << "f(char b, int a)" << endl;
//}

// 返回值不同不能作为重载条件，因为调⽤时也⽆法区分
//void fxx()
//{}
//
//int fxx()
//{
// return 0;
//}
// 下⾯两个函数构成重载
// f()但是调⽤时，会报错，存在歧义，编译器不知道调⽤谁
//void f1()
//{
//	cout << "f()" << endl;
//}
//void f1(int a = 10)
//{
//	cout << "f(int a)" << endl;
//}
//int main()
//{
//	Add(1,2);
//	Add(1.1, 1.2);
//
//	f();
//	f(1);
//
//	f(3, 'A');
//	f('A', 3);
//
//	//fxx();
//
//	//f1();
//	return 0;
//}


//int main()
//{
//	int a = 0;
//	// 引⽤：b和c是a的别名
//	int& b = a;
//	int& c = a;
//	// 也可以给别名b取别名，d相当于还是a的别名
//	int& d = b;
//	++d;
//	int e = 10;
//	d = e;//赋值
//	// 这⾥取地址我们看到是⼀样的
//	cout << &a << endl;
//	cout << &b << endl;
//	cout << &c << endl;
//	cout << &d << endl;
//
//	cout << a << endl;
//	cout << d << endl;
//	return 0;
//}


//void Swap(int& x, int& y)
//{
//	int tmp = y;
//	y = x;
//	x = tmp;
//	
//}
//
//int main()
//{
//	int a = 1;
//	int b = 2;
//	cout << "a = " << a << ",b = " << b << endl;
//	 Swap(a,b);
//	 cout << "a = " << a << ",b = " << b << endl;
//	return 0;
//}

//int Add(int x,int y)
//{
//	int c = x + y;
//	
//	return c;//创建临时变量，临时变量具有常性
//}

int main()
{
	// int& ret = Add(1,2);
	return 0;
}


//inline int Add(int x, int y)
//{
//	int ret = x + y;
//	ret += 1;
//	ret += 1;
//	ret += 1;
//	return ret;
//}
//
//int main()
//{
//	// 可以通过汇编观察程序是否展开
//	// 有call Add语句就是没有展开，没有就是展开了
//	int ret = Add(1, 2);
//	cout << Add(1, 2) * 5 << endl;
//	return 0;
//}



//void print(int a = 10, int b)
//{
//	cout << a << b << endl;
//}
//
//int main()
//{
//	print();
//
//
//
//}


//int add(int a, int b)
//{
//	return a + b;
//}
//
//double add(double a, double b)
//{
//	return a + b;
//}
//
//int main() 
//{
//	cout << add(1, 2) << endl;       // 调用int版本
//	cout << add(1.5, 2.5) << endl;   // 调用double版本
//}